/* 
 * ViaturaService.java
 * 
 * Data de criação: 15/09/2010
 * 
 * O2SOLUTIONS. 
 *
 */
package br.com.o2solutions.siso.service;

import org.springframework.transaction.annotation.Transactional;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.service.Service;
import br.com.o2solutions.siso.integration.entidade.TipoViatura;
import br.com.o2solutions.siso.integration.entidade.Viatura;

/**
 * 
 * Interface responsável por representar as operações negociais que relacionam o
 * objeto de domínio Viatura.
 * 
 * @author Osvaldeir
 * @since 05/10/2010
 * 
 */
@Transactional(rollbackFor={Throwable.class})
public interface ViaturaService extends Service<Viatura> {

	/**
	 * Persiste o objeto {@link TipoViatura} na base de dados.Caso a descricao
	 * do objeto já esteja cadastrada é lançada uma {@link BusinessException}
	 * informando a quebra da regra negocial.
	 * 
	 * @param tipoViatura
	 *            {@link TipoViatura} a ser cadastrada.
	 * 
	 * @throws BusinessException
	 *             Caso a descricao do {@link TipoViatura} já esteja cadastrada.
	 */
	@Transactional(readOnly=false)
	public void saveTipoViatura(TipoViatura tipoViatura)
			throws BusinessException;
	
	/**
	 * {@inheritDoc}. Ao se persistir a Entidade Viatura é necessário que seja verificado:
	 * <ul>
	 * 	<li>
	 * 		A duplicação da viatura na base de dados. É considerada duplicada a viatura contém as seguintes informações já persistidas:
	 * 		<ol>
	 * 			<li>Placa</li>
	 * 			<li>Prefixo</li>
	 * 		</ol>
	 * 	</li>
	 *  <li>
	 *  	Se o ano de fabricação e menor ou igual ao ano do modelo da viatura e ambos valores maiores ou iguais ao ano corrente.
	 *  </li>
	 *  <li>
	 *  	A obrigação de preenchimento dos seguintes campos:
	 *		<ol>
	 * 			<li>Prefixo (máximo de 10 caracteres)</li>
	 * 			<li>Placa (8 caracteres)</li>
	 * 			<li>Ano de Fabricação (4 números)</li>
	 * 			<li>Modelo (4 números)</li>
	 * 		</ol>
	 *  </li>
	 *  <li>
	 *  	O campo Ativo deverá ser um campo de marcação que, ao ser selecionado, indicará que a viatura está ativa. Seu valor inicial deve
	 *  ser marcado.
	 *  </li>
	 * </ul>
	 */
	@Override
	public void save(Viatura entity) throws BusinessException;
	
	/**
	 * {@inheritDoc} O processo de remoção deve ser lógico, ou seja, seu atributo 'removida' deve estar igual a true.
	 * Para o processo de remoção é necessário:
	 * <ul>
	 * 	
	 * </ul>
	 */
	@Override
	public void remove(Viatura entity) throws BusinessException;

}